// 可见性变化事件处理模块

// 检测浏览器支持的可见性属性
window.hiddenProperty = 
    'hidden' in document
        ? 'hidden'
        : 'webkitHidden' in document
        ? 'webkitHidden'
        : 'mozHidden' in document
        ? 'mozHidden'
        : null;

// 定义可见性变化事件名称
const visibilityChangeEvent = hiddenProperty ? hiddenProperty.replace(/hidden/i, 'visibilitychange') : null;

// 导出事件名称以便其他模块使用
export { visibilityChangeEvent };

/**
 * 可见性变化处理类
 */
class VisibilityHandler {
    /**
     * 构造函数
     * @param {Object} options 配置选项
     * @param {Function} options.onShow 页面显示时的回调
     * @param {Function} options.onHide 页面隐藏时的回调
     */
    constructor(options = {}) {
        this.options = {
            onShow: options.onShow || function() {},
            onHide: options.onHide || function() {}
        };
        this.isListening = false;
    }

    /**
     * 开始监听可见性变化
     */
    startListening() {
        if (!visibilityChangeEvent || this.isListening) {
            return;
        }

        document.addEventListener(visibilityChangeEvent, this.handleVisibilityChange.bind(this));
        this.isListening = true;
    }

    /**
     * 停止监听可见性变化
     */
    stopListening() {
        if (!visibilityChangeEvent || !this.isListening) {
            return;
        }

        document.removeEventListener(visibilityChangeEvent, this.handleVisibilityChange.bind(this));
        this.isListening = false;
    }

    /**
     * 处理可见性变化事件
     */
    handleVisibilityChange() {
        if (document[hiddenProperty]) {
            // 页面不可见
            this.options.onHide();
        } else {
            // 页面可见
            this.options.onShow();
        }
    }

    /**
     * 检查页面是否可见
     * @returns {boolean} 页面是否可见
     */
    isVisible() {
        return !document[hiddenProperty];
    }
}

// 导出模块
export default VisibilityHandler;